package com.ten.java.doinit.util;

import com.alibaba.fastjson2.JSONObject;
import lombok.extern.slf4j.Slf4j;

import java.util.stream.Stream;

/**
 * 字符串工具类
 * @author zhangxs
 * @date 2022/6/8 8:52
 */
@Slf4j
public class StringUtils extends org.springframework.util.StringUtils {

    private StringUtils() {}

    /**
     * 空字符串
     */
    public static final String EMPTY = "";

    /**
     * 空值
     */
    public static final String BLANK = null;

    /**
     * 占位符
     */
    public static final String REPLACEMENT = "<>";

    /**
     * 换行符
     */
    public static final String ENTER = "\r\n";

    /**
     *
     */
    public static final String TAB = "\t";

    /**
     * 将数组拼接为字符串
     * @param prefix 前缀
     * @param suffix 后缀
     * @param separator 分隔符
     * @param objects 要拼接的数组
     * @return String
     * @author zhangxs
     * @date 2022/6/9 15:26
     */
    public static String join(String prefix, String suffix, String separator, Object... objects) {
        // 数组为空则返回空字符串
        if (objects == null) {
            return EMPTY;
        }

        // 拼接字符串并返回
        Object[] strings = Stream.of(objects).map(o -> prefix + o instanceof String ? o : JSONObject.toJSONString(o) + suffix).toArray();
        return arrayToDelimitedString(strings, separator);
    }

    /**
     * 格式化字符串（默认使用StringUtils.REPLACEMENT字段作为占位符）
     * @param str 要格式化的字符串
     * @param args 替换的参数
     * @return String
     * @author zhangxs
     * @date 2022/7/11 15:44
     */
    public static String format(String str, Object... args) {
        if (args != null) {
            for (Object arg : args) {
                if (str.contains(REPLACEMENT)) {
                    str = str.replaceFirst(REPLACEMENT, arg.toString());
                }
            }
        }
        return str;
    }

    /**
     * 格式化字符串为驼峰格式（默认使用'_'进行分割）
     * @param str 要格式化的字符串
     * @param firstCharUpperCase 首字母是否大写
     * @return String
     * @author zhangxs
     * @date 2022/7/11 15:45
     */
    public static String camelFormat(String str, boolean firstCharUpperCase) {
        return firstCharCase(str, "_", true, firstCharUpperCase ? 0 : 1);
    }

    /**
     * 首字母转大写
     * @param str 要转换的字符串
     * @return String
     * @author zhangxs
     * @date 2022/7/11 15:47
     */
    public static String firstCharUpperCase(String str) {
        return firstCharCase(str, str + "_", true, 0);
    }

    /**
     * 首字母转小写
     * @param str 要转换的字符串
     * @return String
     * @author zhangxs
     * @date 2022/7/11 15:47
     */
    public static String firstCharLowerCase(String str) {
        return firstCharCase(str, str + "_", false, 0);
    }

    /**
     * 首字母转换
     * @param str 要转换的字符串
     * @param separator 占位符
     * @param upper 是否转为大写
     * @param skip 是否需要跳过
     * @return String
     * @author zhangxs
     * @date 2022/7/11 15:47
     */
    public static String firstCharCase(String str, String separator, boolean upper, int skip) {
        String[] strings = str.split(separator);
        for (int i = skip; i < strings.length; i++) {
            String string = strings[i];
            String prefix = string.substring(0, 1);
            strings[i] = (upper ? prefix.toUpperCase() : prefix.toLowerCase()) + string.substring(1);
        }
        return join("", "", "", strings);
    }
}